昨天我們玩過 Word2Vec、GloVe、FastText,還有 LSTM。這些方法都很好,但是在 Kaggle 這種比賽裡,有時候「速度 + 穩定性」比什麼都重要。
今天要帶大家看一個經典卻常常被忽略的強力 baseline:TF-IDF + Logistic Regression。
TF-IDF
Logistic Regression
所以很多 NLP 任務,只要資料不是太複雜,這組合常常能打趴一堆 fancy 的模型。
今天的程式碼主要分五步:
# =======================
# TF-IDF + Logistic Regression (強力且很快的 baseline)
# =======================
# 1) 讀資料
train_df = pd.read_csv("train.csv")
test_df = pd.read_csv("test.csv")
sample_sub = pd.read_csv("sample_submission.csv")
TEXT_COL = "body"
TARGET_COL = "rule_violation"
X_text = train_df[TEXT_COL].astype(str).values
y = train_df[TARGET_COL].values
# 2) 切分驗證
X_tr, X_val, y_tr, y_val = train_test_split(
X_text, y, test_size=0.2, random_state=42, stratify=y
)
# 3) 建立 TF-IDF + LR pipeline
word_tfidf = TfidfVectorizer(analyzer="word", ngram_range=(1, 2), min_df=3, max_df=0.9)
char_tfidf = TfidfVectorizer(analyzer="char", ngram_range=(3, 5), min_df=3, max_df=0.95)
features = FeatureUnion([("word", word_tfidf), ("char", char_tfidf)])
clf = LogisticRegression(solver="saga", C=4.0, class_weight="balanced", max_iter=2000)
pipe = Pipeline([("tfidf", features), ("clf", clf)])
# 4) 驗證
pipe.fit(X_tr, y_tr)
val_pred = pipe.predict(X_val)
print("Validation Accuracy:", accuracy_score(y_val, val_pred))
print("Validation F1:", f1_score(y_val, val_pred, average="macro"))
# 5) 全量訓練 + 產生 submission.csv
pipe.fit(X_text, y)
test_pred = pipe.predict(test_df[TEXT_COL].astype(str).values)
sub = sample_sub.copy()
sub[sub.columns[1]] = test_pred
sub.to_csv("submission.csv", index=False)
執行完就能直接丟上 Kaggle 提交啦!🎉
在我的驗證集上,TF-IDF + Logistic Regression 很快就跑出來,準確率和 F1 分數都不差,重點是 速度超快!
不用等半天,CPU 就能搞定,真的是比 Kaggle Notebook 裡面跑 LSTM、BERT 爽快太多。
今天我們用 TF-IDF + Logistic Regression 打出一個穩定 baseline。
明天要進一步:
一步一步堆疊,慢慢往 leaderboard 前進。💪
重點結論:有時候最簡單的方法,反而最可靠。